5.2.4 メタクラス
クラス自体もオブジェクト
インスタンス(=クラスオブジェクト)はクラスのインスタンス
メタクラスとは他の型(クラス)を定義する型(クラス)です。(Kindle版 p.267)
メタクラスはtypeクラスのサブクラス
あるクラスは、メタクラスのインスタンス
クラスオブジェクトは、あるクラスのインスタンス
typeで動的にクラスを定義する例
クラス文で作成されたすべてのクラスは、暗黙的にそのメタクラスとしてtypeを使います。(Kindle版 p.269)
クラス文のmetaclassというキーワード引数で変更できる!
TODO class文を確認
デフォルトはclass Foo(metaclass=type)
typeの呼び出しシグネチャ
name
bases
namespace
typeを継承するクラスをmetaclassに指定するのが一般的
type()を呼び出す関数でもよい
typeを継承するクラス(=メタクラス)
__new__
クラスオブジェクトを生成
__prepare__(classmethod)
名前空間オブジェクトを生成
デフォルトは空の辞書
オーバーライド可能
__call__
メタクラスのインスタンス(=クラス)が呼び出されたとき
=あるクラスの新しいオブジェクトを生成するとき
例:RevealingMeta(メタクラス)
class RevealingMeta(type):
class RevealingClass(metaclass=RevealingMeta):
__new__と__init__を定義
RevealingClassを定義したタイミングで以下が呼ばれる
1. RevealingMetaの__prepare__
2. RevealingMetaの__new__
3. RevealingClassの__init__
これはRevealingMetaの__init__ということだと思う(TODO)
メタクラスのインスタンス化という理解
instance = RevealingClass()
メタクラスを継承したクラスを呼び出したとき、以下が呼ばれる
1. RevealingClassの__call__
2. RevealingClassの__new__
3. RevealingClassのobjectの__init__
メタクラスを継承したクラスのインスタンス化